﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Entidades.Enums;
using MIAP.Negocio;
using MIAPWEB.Common;
using System.Linq;

namespace MIAPWEB.Forms
{
    /// <summary>
    /// Clase de la vista AdministrarProyectos.
    /// </summary>
    public partial class AdministraProyecto : PageBase
    {
        #region Constantes
        #endregion

        #region Campos

        /// <summary>
        /// Almacena el id del estatus del proyecto.
        /// </summary>
        private int idEstatus = 0;

        /// <summary>
        /// Almacena el nombre del proyecto.
        /// </summary>
        private string nombreProyecto = string.Empty;

        /// <summary>
        /// Almacena el estatus del proyecto;
        /// </summary>
        private bool? estatus;

        /// <summary>
        /// Clase de negocio de las operaciones de proyectos.
        /// </summary>
        private AdministrarProyectosNegocio proyectoNegocio;

        /// <summary>
        /// Clase de negocio de las operaciones de archivos.
        /// </summary>
        private AdministrarArchivosNegocio archivosNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;  

        #endregion

        #region Propiedades

        /// <summary>
        /// Id del proyecto 
        /// </summary>
        private int? IdProyecto
        {
            get
            {
                if (this.ViewState[AppQueryStrings.IdProyecto] == null)
                {
                    this.ViewState[AppQueryStrings.IdProyecto] = "0";
                }

                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdProyecto]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdProyecto] = value;
            }
        }

        /// <summary>
        /// registros busqueda
        /// </summary>
        private List<ProyectoInfo> DataSourceProyectos
        {
            get
            {
                if (this.ViewState["DataSourceProyectos"] == null)
                {
                    this.ViewState["DataSourceProyectos"] = new List<ProyectoInfo>();
                }

                return this.ViewState["DataSourceProyectos"] as List<ProyectoInfo>;
            }

            set
            {
                this.ViewState["DataSourceProyectos"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una nueva instancia <see cref="AdministrarProyectosNegocio"/>
        /// </summary>
        public AdministraProyecto()
        {
            this.proyectoNegocio = new AdministrarProyectosNegocio();
            this.archivosNegocio = new AdministrarArchivosNegocio();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdProyectos.PageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);

            if (!IsPostBack)
            {
                this.GetEstatusProyecto();
                this.Search();

                var permiso = AppSessionManager.Instance.Permisos.Where(p => p.Url == AppUrls.AltaProyectos).SingleOrDefault();

                if (permiso == null)
                {
                    this.btnNuevo.Enabled = false;
                }
            }
        }

        /// <summary>
        /// Busca todos los proyectos dependiendo de los filtros.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        /// <summary>
        /// realiza la busqueda con los campos especificados en los controles
        /// </summary>
        private void Search()
        {
            this.GetFilters();
            this.GetProyectosByFilters();
        }

        /// <summary>
        /// Redirecciona a la vista de AltaProyecto.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(AppUrls.AltaProyectos);
            this.CleanSeleccion();
        }

        /// <summary>
        /// Redirecciona a la vista AltaProyecto.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnModificar_Click(object sender, EventArgs e)
        {
            if (!this.IdProyecto.HasValue || this.IdProyecto == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.Response.Redirect(string.Format("{0}?{1}={2}", AppUrls.AltaProyectos, AppQueryStrings.IdProyecto, this.IdProyecto));
            this.CleanSeleccion();
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            if (!this.IdProyecto.HasValue || this.IdProyecto == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.proyectoNegocio.ChangeEstatusProyecto(this.IdProyecto.Value, false);
            AppSessionManager.Instance.RecalculaPermisos();
            this.CleanSeleccion();
            this.Search();
        }

        protected void grdProyectos_SelectedIndexChanged(object sender, EventArgs eventArgs)
        {

            var dataKey = grdProyectos.DataKeys[((GridView)sender).SelectedIndex];
            if (dataKey == null) return;
            var colsNoVisible = dataKey.Values;
            this.IdProyecto = Convert.ToInt32(colsNoVisible[0]);
            if (this.IdProyecto > 0)
            {
                GetArchivosByProyecto(this.IdProyecto.Value);
            }

        }

        /// <summary>
        /// Evento que ocurre al seleccionar una página.
        /// </summary>
        /// <param name="sender">Objeto que inicio el evento</param>
        /// <param name="e">Parámetros de ejecución</param>
        protected void grdProyectos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdProyectos.PageIndex = e.NewPageIndex;
            this.grdProyectos.DataSource = DataSourceProyectos;
            this.grdProyectos.DataBind();
        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene los estatus del proyecto.
        /// </summary>
        public void GetEstatusProyecto()
        {
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlEstatus);            
        }

        /// <summary>
        /// Obtiene todos los archivos de un determinado proyecto.
        /// </summary>
        public void GetArchivosByProyecto(int idProyecto)
        {
            var listaArchivos = idProyecto > 0 ? this.archivosNegocio.GetArchivosByProyecto(idProyecto) : null;
            this.grdArchivos.DataSource = listaArchivos;
            this.grdArchivos.DataBind();
        }

        /// <summary>
        /// Obtiene todos los proyectos.
        /// </summary>
        public void GetProyectos()
        {
            this.grdProyectos.DataSource = this.proyectoNegocio.GetProyectos();

            this.grdProyectos.DataBind();
        }

        /// <summary>
        /// Obtiene los proyectos de acuerdo a los filtros.
        /// </summary>
        public void GetProyectosByFilters()
        {
            DataSourceProyectos = this.proyectoNegocio.GetProyectosByFilters(nombreProyecto, estatus);
            this.grdProyectos.DataSource = DataSourceProyectos;
            this.grdProyectos.DataBind();
            this.CleanSeleccion();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        public void GetFilters()
        {
            this.idEstatus = int.Parse(this.ddlEstatus.SelectedValue);

            this.estatus = (idEstatus == int.Parse(this.comunesNegocio.ValorTodos))
                               ? (bool?)null
                               :(idEstatus == ((int) Estatus.Activo));                

            this.nombreProyecto = txtNombre.Text;
        }

        private void CleanSeleccion()
        {
            grdProyectos.SelectedIndex = -1;
            this.IdProyecto = null;
            GetArchivosByProyecto(0);
        }


        #endregion
    }
}